#include <stdio.h>
#include <malloc.h>


//用单向链表来实现一个栈
//1.定义stack数据结构
typedef int ElementType;
typedef struct node{
    //1.数据项
    ElementType data;
    //2.地址项
    struct node *next;
}SNode;
//2.实现操作
//2.1初始化，创建一个空栈
/*
 * 函数名：InitStack
 * 输入：无
 * 输出：返回创建好的空栈
 * */
SNode *InitStack(){
    //创建空栈
    SNode *stackTop = malloc(sizeof(SNode));
    stackTop->next=NULL;
    return stackTop;
}
//2.2进栈
/*
 * 功能：给一个栈插入一个元素
 * 函数名：Push
 * 输入：栈 元素
 * 输出：无
 *
 * */

void Push(SNode *stackTop,ElementType data){
    //1.创建一个节点，将元素放进节点
    SNode *newNode= malloc(sizeof(SNode));
    newNode->data=data;
    //2.将新创建的节点指向原来的第一个节点
    newNode->next=stackTop->next;
    //3.将top节点指向新的第一个节点（新创建的节点）
    stackTop->next=newNode;
}

//2.3出栈 在栈不为空的情况下进行出栈
/*
 *
 * 函数名：Pop
 * 输入：被执行操作的栈
 * 输出：返回被删除的栈顶元素 ElementType
 * */

ElementType Pop(SNode *stackTop){

    //1.栈为空
    if(stackTop->next==NULL){
        printf("栈为空，无法进行删除\n");
        return -1000;//-1000代表不成功
    }
    //栈不为空
    //2.top.next=top.next.next
    SNode *tmp=stackTop->next;
    ElementType data = tmp->data;
    //删除
    stackTop->next=tmp->next;
    //释放空间
    free(tmp);
    return data;
}

int main() {
    //1.创建空栈
    SNode *stack= InitStack();

    //2进栈
    ElementType data;
    for(int i=0;i<5;i++){
        scanf("%d",&data);
        Push(stack,data);
    }
    //3.出栈
    Pop(stack);
   // printf("Hello, World!\n");
    return 0;
}
